package com.citywy.service.impl;

import com.citywy.dao.AccountDao;
import com.citywy.dao.impl.AccountDaoImpl;
import com.citywy.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/**
 * <bean id="accountService" class="com.citywy.service.impl.AccountServiceImpl"
 *      scope="" init-method="" destroy-method="">
 *      <property name="" value="" | ref=""></property>
 * </bean>
 *
 * 1.用于创建对象的注解:对应xml中bean标签功能
 *      @Component
 *      作用:把当前类对象存入spring容器中
 *      属性：
 *          value:用于指定bean的id，不写时默认值是当前类名，且首字母小写
 *      @Controller 一般用在表现层(springmvc里就用的controller)
 *      @Service  一般用在业务层(service)
 *      @Repository 一般用于持久层(dao)
 *      上面三个注解和Component注解一模一样，他们三个是spring框架为我们提供明确的三层使用的注解，显得更清晰
 *
 * 2.用于注入数据的：对应xml中property注入一样的
 *      他的作用就和在xml配置文件中的bean标签中写一个<property>标签的作用是一样的
 *      Autowired:
 *          作用：自动按照类型注入。只要容器中有唯一的一个bean对象类型 和 要注入的类型匹配，就可注入成功；
 *              如果IOC容器中没有bean的类型和要注入的变量类型匹配，则报错；
 *              如果IOC容器中有多个bean一样，优先匹配变量名称和bean的key同名的，否则报错；
 *          位置：可以是变量上，也可以是方法上
 *      Qualifier:
 *          作用：在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是给方法参数注入时可以。
 *          属性：
 *              value:用于指定bean的id
 *      Resource:
 *          作用：直接按照bean的id注入，可以独立使用
 *          属性：
 *              name:用于指定bean的id
 *      以上三个注解都只能注入其它bean类型的数据，而基本类型和String类型无法使用上述注解实现。另外，集合类型注入只能通过XML来实现
 *
 *      Value:
 *          作用：用于注入基本类型和String类型的数据
 *          属性：
 *              value:用于指定数据的值。它可以使用spring中的SpEL(spring中的EL表达式)
 *                    SpEL的写法：${表达式}
 *
 * 用于改变作用范围的：对应bean标签中scope属性
 *      Scope
 *          作用：用于指定bean的作用范围
 *          属性：
 *              value：指定范围的取值。常用取值：singleton  prototype
 *
 * 和生命周期相关的(了解)：对应bean中init-method和destroy-method
 *      PreDestroy
 *          作用：用于指定销毁方法
 *      PostConstruct
 *          作用：用于指定初始化方法
 */

@Component("accountService")
//@Scope("prototype")
public class AccountServiceImpl implements AccountService {
//    @Autowired
//    @Qualifier("accountDao1")
//    private AccountDao ad;

    @Resource(name="accountDao1")
    private AccountDao ad;

    public AccountServiceImpl() {
        System.out.println("实例化了AccountServiceImpl");
    }

    @PostConstruct
    public void init(){
        System.out.println("初始化");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("销毁方法");
    }

    public void saveAccount() {
        ad.saveAccount();
    }
}
